// 弱符号的意义
// 出现多个同名变量、函数冲突时，如在lib.c和main.c中都定义了同名变量a
// 会报错，因为两个都是强符号，但是如果lib.c或main.c中有一个a是弱符号，编译正常
// 使用强符号，弱符号被丢弃。整个工程中有效的是强符号的变量，函数同理。


// lib.c
// int a __attribute__((weak)) = 1;

//main.c
#include "stdio.h"
int a = 4;


// 1）常规函数，只声明，未定义 ---》报错，链接阶段找不到定义
// void func1(void);

// 2）弱符号函数，只声明，未定义 ---》编译通过，在运行到该函数时报错
// 编译器将函数名即弱符号设置为0；
// 然后程序运行到这个函数时，跳到地址0位置执行，此时报错。
void __attribute__((weak)) ufunc(void); // 只声明，未定义

// 弱符号函数，正确定义声明
void __attribute__((weak)) func(void);
void func(void) {
    return ;
}

int main(void)
{
    printf("main：a = %d\n", a);    // 4
	
/*
 * 函数被声明为弱符号时，如果函数只声明而未定义；
 * 函数在编译链接时都不会报错，只有在运行到该函数时才会报错。
 */
    printf("ufunc :%p\n", ufunc);   // 0
    printf("func  :%p\n", func);    // 某地址

    if (func)   // 如果已定义则可以调用
        func();
    return 0;
}
